﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lexer = LeksickiAnalizator;
using Parser = SintaksniAnalizator;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using magic8ballUtility.Sintaksa;


namespace JezicniProcesor
{
    class Program
    {
        static void Main(string[] args)
        {
            var listaUniformnihZnakova = new Lexer.ListaUniformnihZnakova();
            var tablicaIzvornihZnakova = new Lexer.TablicaIzvornihZnakova();

            var leksickiAnalizator = new Lexer.LeksickiAnalizator(listaUniformnihZnakova, tablicaIzvornihZnakova);

            var pogreske = leksickiAnalizator.Obradi(new StreamReader(args[0]));
            Lexer.Sucelje suceljeLexera = new Lexer.Sucelje();
            suceljeLexera.DodajIzvore(args[0], listaUniformnihZnakova, tablicaIzvornihZnakova, pogreske);

            new Thread(new ThreadStart(delegate()
            {
                suceljeLexera.ShowDialog();
            })).Start();
            

            magic8ballUtility.Sintaksa.Definicija definicija;

            using (Stream stream = File.Open(@"definicija.bin", FileMode.Open))
            {
                BinaryFormatter formater = new BinaryFormatter();
                definicija = (magic8ballUtility.Sintaksa.Definicija)formater.Deserialize(stream);
            }

            Parser.SintaksniAnalizator sintaksniAnalizator = new Parser.SintaksniAnalizator(listaUniformnihZnakova, tablicaIzvornihZnakova, definicija);
            sintaksniAnalizator.PokreniObradu();

            List<magic8ballUtility.Sintaksa.Produkcija> popisPrimijenjenihProdukcija = new List<magic8ballUtility.Sintaksa.Produkcija>();
            foreach (var redukcija in sintaksniAnalizator.PopisPrimijenjenihRedukcija)
            {
                popisPrimijenjenihProdukcija.Insert(0, redukcija);
            }

            //Parser.Cvor korijenGenerativnogStabla = Parser.Program.GradnjaGenerativnogStabla(popisPrimijenjenihProdukcija);
            SintaksniAnalizator.Sucelje sucelje = new SintaksniAnalizator.Sucelje(sintaksniAnalizator.Korijen);
            sucelje.ShowDialog();
        }
    }
}
